-- -- Copyright 2014 Alessandro Gerlinger Romero -- -- This file is part of Hybrid fUML. -- -- Hybrid fUML is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Hybrid fUML is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with Hybrid fUML. If not, see . -- ------------------------------------------------------------------------------------------------------------------------------------------------------------ -- DERIVED FUNCTIONS -- defined to support base semantics function_fUML_noOutgoingEdge :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> Bool function_fUML_noOutgoingEdge n = if null (expr2list (function_ActivityNode_outgoing n)) then True else False function_fUML_noIncomingEdge :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> Bool function_fUML_noIncomingEdge n = if null (expr2list (function_ActivityNode_incoming n)) then True else False function_fUML_maxOneOutgoingEdge :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> Bool function_fUML_maxOneOutgoingEdge n = if length (expr2list (function_ActivityNode_outgoing n)) <= 1 then True else False function_fUML_maxOneIncomingEdge :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> Bool function_fUML_maxOneIncomingEdge n = if length (expr2list (function_ActivityNode_incoming n)) <= 1 then True else False function_fUML_requiredInputPin :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> Bool function_fUML_requiredInputPin n = if function_ActivityNode_type(n) == FUML_Syntax_Actions_BasicActions_InputPin && function_ActivityNode_lower n /= 0 then True else False function_fUML_executableWithoutInput :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> Bool function_fUML_executableWithoutInput n = if function_fUML_isExecutableNode(n) && function_fUML_noIncomingEdge(n) && (notElem False (map (\ip -> not (function_fUML_requiredInputPin ip || card (function_ActivityNode_incoming ip) > 0 )) (expr2list (function_ActivityNode_Action_input n)))) then True else False function_fUML_actionsToBeInitiallyTriggered :: FUML_Syntax_Classes_Kernel_Classifier -> [FUML_Syntax_Activities_IntermediateActivities_ActivityNode] function_fUML_actionsToBeInitiallyTriggered act = let ns = expr2list (function_Activity_node act) in filter (\n -> function_fUML_executableWithoutInput n) ns ------------------------------------------------------------------------------------------------------------------------------------------------------------ -- SUPORT SYNTACTICAL ANALYSIS - derived according embedding approach function_fUML_isExecutableNode :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> Bool function_fUML_isExecutableNode = function_fUML_isAction -- check if it is an ACTION function_fUML_isAction :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> Bool function_fUML_isAction n | function_ActivityNode_type(n) == FUML_Syntax_Actions_IntermediateActions_ValueSpecificationAction = True | function_ActivityNode_type(n) == FUML_Syntax_Actions_IntermediateActions_CreateObjectAction = True | function_ActivityNode_type(n) == FUML_Syntax_Actions_BasicActions_CallBehaviorAction = True | function_ActivityNode_type(n) == FUML_Syntax_Actions_IntermediateActions_AddStructuralFeatureValueAction = True | function_ActivityNode_type(n) == FUML_Syntax_Actions_IntermediateActions_ReadStructuralFeatureAction = True | function_ActivityNode_type(n) == FUML_Syntax_Actions_IntermediateActions_ReadSelfAction = True | function_ActivityNode_type(n) == FUML_Syntax_Actions_BasicActions_SendSignalAction = True | function_ActivityNode_type(n) == FUML_Syntax_Actions_CompleteActions_AcceptEventAction = True | function_ActivityNode_type(n) == FUML_Syntax_Actions_CompleteActions_StartObjectBehaviorAction = True | function_ActivityNode_type(n) == FUML_Syntax_Actions_IntermediateActions_ClearStructuralFeatureAction = True | otherwise = False